package thread;

/**
 * 如果一个静态方法使用synchroized后面,后面该方法一定具有同步效果,多个线程一定分开执行
 */
public class SyncDemo3 {
    public static void main(String[] args) {
/*  Thread t1=new Thread(new Runnable(){
           public void run(){
            Boo.doSome();
         }
       });

       Thread t1=new Thread(()->Boo.doSome());
*/

//        Thread t1=new Thread(Boo::doSome);
//        Thread t2=new Thread(Boo::doSome);//同时执行

        Boo b1=new Boo();
        Boo b2=new Boo();
        Thread t1=new Thread(()->b1.doSome());
        Thread t2=new Thread(()->b2.doSome());
        t1.start();
        t2.start();
    }
}

class Boo{
    /*
        静态方法上使用synchronized,同步监视器对象不可选,使用的是当前类的类对象
        Class的实例
        在JVM中每个类都只有一个类对象,因此静态方法指定类对象可做到一定具有同步效果
        类对象的知识会在后面学习反射时解释.
     */
//    public synchronized static void doSome(){
        public static void doSome(){
            synchronized (Boo.class){//类型对象指定格式:类名,class
                Thread t=Thread.currentThread();
                System.out.println(t.getName()+":正在执行doSome方法...");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(t.getName()+"执行doSome方法完毕");
            }

    }
}